gesture: Ensure late gestures handling the sequence get the group state
authorCarlos Garnacho <carlosg@gnome.org>
Sun, 1 Jun 2014 19:44:55 +0000 (21:44 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 3 Jun 2014 13:59:03 +0000 (15:59 +0200)
It might happen that a gesture claims a sequence before any other gesture
in its group even handled a single event from that sequence. In that case,
ensure the state is set accordingly right when the sequence is handled in
those.

The "group" gesture testcase has been updated to observe this behavior.

gtk/gtkgesture.c
testsuite/gtk/gestures.c

index 5ba3fe972dcb89e82cbf0988feaff15477fd5d2a..c7526299bce589413a83926f15b004b1c838cd87 100644 (file)
@@ -158,6 +158,8 @@ static guint signals[N_SIGNALS] = { 0 };
 
 #define BUTTONS_MASK (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)
 
+GList * _gtk_gesture_get_group_link (GtkGesture *gesture);
+
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkGesture, gtk_gesture, GTK_TYPE_EVENT_CONTROLLER)
 
 static void
@@ -369,6 +371,29 @@ _update_widget_coordinates (GtkGesture *gesture,
   data->widget_y = y;
 }
 
+static GtkEventSequenceState
+gtk_gesture_get_group_state (GtkGesture       *gesture,
+                             GdkEventSequence *sequence)
+{
+  GtkEventSequenceState state = GTK_EVENT_SEQUENCE_NONE;
+  GList *group_elem;
+
+  group_elem = g_list_first (_gtk_gesture_get_group_link (gesture));
+
+  for (; group_elem; group_elem = group_elem->next)
+    {
+      if (group_elem->data == gesture)
+        continue;
+      if (!gtk_gesture_handles_sequence (group_elem->data, sequence))
+        continue;
+
+      state = gtk_gesture_get_sequence_state (group_elem->data, sequence);
+      break;
+    }
+
+  return state;
+}
+
 static gboolean
 _gtk_gesture_update_point (GtkGesture     *gesture,
                            const GdkEvent *event,
@@ -416,6 +441,8 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
                                           NULL, (gpointer *) &data);
   if (!existed)
     {
+      GtkEventSequenceState group_state;
+
       if (!add)
         return FALSE;
 
@@ -427,6 +454,9 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
 
       data = g_new0 (PointData, 1);
       g_hash_table_insert (priv->points, sequence, data);
+
+      group_state = gtk_gesture_get_group_state (gesture, sequence);
+      gtk_gesture_set_sequence_state (gesture, sequence, group_state);
     }
 
   if (data->event)
index e946ef2cc8c5f10a6c523dbab25d276b700d6325..0bf3d023f752ed0210707c349199440c6754d17c 100644 (file)
@@ -497,8 +497,8 @@ test_group (void)
                    "b1 state denied, "
                    "a1 state denied, "
                    "c3 state claimed, "
+                   "c2 state claimed, "
                    "target c2");
-  /* FIXME: why no "c2 state claimed" ? */
 
   g_string_free (str, TRUE);